﻿using UnityEngine;
using System.Collections;

public class EnemyManager : MonoBehaviour {
	Stats stats;
	GameObject Player;
    LevelManager gameManager;
    public GameObject[] DROP;
	public Navigator nav;
	public Node[] Path = null;
	public int Next = 1;
	public bool Walking = false;
	public bool Turn = false;
	public bool wait = true;
    public bool dead = false;
	void Start () {
		Player = GameObject.FindGameObjectWithTag ("Player"); //Geter de player(algo mas de performance, lol).
		stats = gameObject.GetComponent<Stats> (); //Geter de los stats del enemigo.
        gameManager = GameObject.FindGameObjectWithTag("GameManager").GetComponent<LevelManager>();
	}

	void FixedUpdate(){
        //comprobación de estados.
        if (stats.currentState.Equals(Stats.State.Dead) && !dead)
        {
            nav.mapa.theMap.Tiles[(int)transform.position.x, (int)transform.position.z].GetComponentInChildren<Node>().NPCWalcable = true;
            Instantiate(DROP[(int)Random.Range(0,DROP.Length)], transform.position, Quaternion.identity);
            dead = true;
            gameManager.EnemysTurn.Remove(gameObject);
            Destroy(gameObject);
        }
        else
        {
            //Fin comprobación de estados.
            if (Path.Length > 0 && Walking)
            { //si tengo path y estoy caminando.
                if (Path[Next].Pos != gameObject.transform.position && Path[Next].NPCWalcable)
                {  //si mi posición es distinta a la del nodo siguiente, y el nodo siquiente no esta bloqueado.
                    transform.LookAt(Path[Next].Pos);
                    transform.position = Vector3.MoveTowards(transform.position, Path[Next].Pos, Time.deltaTime * 10);	//Camino hacia ese nodo.
                }
                else
                {    //si mi posición es la del nodo siguiente o no esta bloqueado.
                    if (Path[Next].NPCWalcable)
                    { //Si esta boqueado
                        if (Next < Path.Length - 2)
                        { //si el nxt no es la posición del Player-1(para no pisarlo).
                            Next++; //Pasa al siguiente nodo
                            Player.GetComponent<MapExplorer>().EnemyUpdateVisual();
                        }
                        else
                        { //sino
                            Path[Next].NPCWalcable = false; //bloquea el siguiente nodo.
                            Walking = false;    //No camina mas.
                            wait = false;   //y termina el turno.
                        }
                    }
                    else
                    {
                        nav.mapa.theMap.Tiles[(int)transform.position.x, (int)transform.position.z].GetComponentInChildren<Node>().NPCWalcable = false; //si no esta bloqueado, lo boquea.
                        Walking = false;    //No camina mas.
                        wait = false;   //y termina el turno.
                    }
                }
            }
        }
	}
    //Calcula y define el path para que el enemigo camine.
	public void GoToPos(Node t){
		Next = 0;   //Setea el valor del siguiente nodo en 0(al cual va a caminar, ya que el actual no se cuenta).
		Path = nav.GetPathToDestiny (t);    //Calcula el path para poder llegar al jugador.
		nav.mapa.theMap.Tiles [(int)transform.position.x, (int)transform.position.z].GetComponentInChildren<Node> ().NPCWalcable = true;    //Desbloquea el nodo actual para que player o enemy puedan pisarlo.
        Walking = true; //setea Walking en true para que el enemy camine, luego se seteara en false cuando termine el turno.
	}
    //retorna false si no pudo realizar el turno.
	public bool ExcecuteTurn(){
        //si el jugador esta en el rango de ataque.
		if(Vector3.Distance(Player.transform.position,transform.position)<=stats.AttackRange){
			Player.GetComponent<Stats>().RecibeDamage(stats.Damage); //Lo ataca.
            return false;
		}else//Si el jugador esta en el rango de visión.
        if (Vector3.Distance(Player.transform.position, transform.position) <= stats.ViewDistance)
        {
            Turn = true;    //Setea turno en true.
            GoToPos(Player.GetComponent<PlayerManager>().ActualNode);   //ejcuta el turno.
            return true;    //Retorna que si se pudo ejecutar el turno.
        }
        else {
            return false;
        }
	}
}
